#ifndef DATAHANDLER_H
#define DATAHANDLER_H

#include <QObject>
#include "./entities/messageentities.h"


class DataHandler : public QObject
{
    Q_OBJECT
public:
    static DataHandler& getInstance();

    DataHandler(DataHandler&) = delete;
    DataHandler& operator=(const DataHandler&) = delete;

public slots:
    /* 处理来自tcp线程的信号 */
    // 处理来自tcp线程的登出请求(防止用户不主动登出，数据库不同步)
    void handleSuddenLogout(const qintptr descriptor, const QString UserId);
    // 接收来自tcp线程原始数据
    void handleByteData(const qintptr descriptor, const QByteArray originData);

    /* 接收来自数据库服务线程的回应消息 */
    // 准备发送登录回应
    void sendLoginResponse(const qintptr descriptor, const LoginResponseMessage);
    // 准备发送注册回应
    void sendRegisterResponse(const qintptr descriptor, const RegisterResponseMessage);
    // 准备发送登出回应
    void sendLogoutResponse(const qintptr descriptor, const LogoutResponseMessage);
    // 准备发送用户的搜索结果
    void sendSearchUserResponse(const qintptr descriptor, const SearchUserResponseMessage);
    // 准备转发好友申请给另一个客户端
    void sendFriendApplicationRequest(const QString userId, const ApplyFriendRequestMessageToClient);
    // 准备转发好友申请审核结果给另一个客户端
    void sendFriendApplicationResultResponse(const QString userId, const ApplyFriendResponseMessageToClient);
    // 准备转发给某个用户下线期间，其他用户发的聊天消息
    void sendNewChatMsg(const QString receiverId, const ChatMessageToClient);
    // 准备转发视频通话请求结果给请求客户端
    void sendVideoResponseToRequestUser(const QString requestUserId, const VideoResponseToClient);
    // 准备转发视频通话请求给另一个客户端
    void sendVideoRequestToResponseUser(const QString responseUserId, const VideoRequestToClient);



private:
    static DataHandler m_instance;

    // 处理消息
    void handleMessage(const qintptr descriptor, const QByteArray& messageByteArray);
    // 处理图像
    void handleImage(const qintptr descriptor, const QByteArray& imageByteArray);

    explicit DataHandler(QObject *parent = nullptr);
    ~DataHandler();

signals:
    /* 发给tcp线程的信号 */
    // 根据指定套接字描述符发送消息
    void dataReadyToSend(const qintptr descriptor, const QByteArray packedData);
    // 根据指定id发送消息
    void dataReadyToSend(const QString userId, const QByteArray packedData);

    /* 发给数据库验证线程 */
    // 处理客户端发来的验证请求
    void dealLoginRequestMessage(const qintptr descriptor, const LoginRequestMessage);
    // 处理客户端发来的注册请求
    void dealRegisterRequestMessage(const qintptr descriptor, const RegisterRequestMessage);
    // 处理客户端发来的登出请求
    void dealLogoutRequestMessage(const qintptr descriptor, const LogoutRequestMessage);
    // 处理客户端发来的用户搜索请求
    void dealSearchUserRequestMessage(const qintptr descriptor, const SearchUserRequestMessage);
    // 处理客户端发来的好友申请请求
    void dealApplyFriendRequestMessageToServer(const qintptr descriptor, const ApplyFriendRequestMessageToServer);
    // 处理客户端审理好友申请的结果
    void dealApplyFriendResponseMessage(const qintptr descriptor, const ApplyFriendResponseMessageToServer);
    // 处理客户端加载完毕后请求其不在线时收到的数据的消息
    void dealRequestBufferDataMessage(const qintptr descriptor, const RequestBufferDataMessage);
    // 处理客户端收到好友申请后发来的确认消息
    void dealFriendApplicationSendStatus(const qintptr descriptor, const GetApplicationFromServer);
    // 处理客户端收到好友申请结果后发来的确认消息
    void dealFriendApplicationResultSendStatus(const qintptr descriptor, const GetApplicationResultFromServer);
    // 处理客户端发给其好友的聊天消息
    void dealChatMessage(const qintptr descriptor, const ChatMessageToServer);
    // 处理客户端收到好友聊天消息后发来的确认消息
    void dealChatMsgStatus(const qintptr descriptor, const GetChatMessageFromServer);
    // 处理客户端发起的视频通话请求
    void dealVideoRequest(const qintptr descriptor, const VideoRequestToServer);
    // 处理客户端回复的视频通话请求结果
    void dealVideoResponse(const qintptr descriptor, const VideoResponseToServer);
};

#endif // DATAHANDLER_H
